package com.tom.AIAnswer.manager;

import com.zhipu.oapi.ClientV4;
import com.zhipu.oapi.Constants;
import com.zhipu.oapi.service.v4.model.ChatCompletionRequest;
import com.zhipu.oapi.service.v4.model.ChatMessage;
import com.zhipu.oapi.service.v4.model.ChatMessageRole;
import com.zhipu.oapi.service.v4.model.ModelApiResponse;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 新建AIManager类，来让其他需要AI功能的类快速调用
 * 封装调用AI请求的各种SDK方法
 */
@Component
public class AiManager {

    @Resource
    private ClientV4 client;

    private final static float STABLE_TEMPERATURE = 0.99f;

    private final static float UNSTABLE_TEMPERATURE = 0.05f;

    /**
     * 调用AI功能 （抽象化）
     * @param messages
     * @param stream
     * @param temperature
     * @return
     */
    public String sendAIRequest(List<ChatMessage> messages,Boolean stream,Float temperature) {
        // 调用AI功能

        //调用模型接口
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(Constants.ModelChatGLM4)
                .stream(stream)
                .invokeMethod(Constants.invokeMethod)
                .messages(messages)
                .temperature(temperature)
                .build();

        try{
            ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
            return invokeModelApiResp.getData().getChoices().get(0).toString();
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("调用AI功能失败");
        }

    }

    /**
     * 把AI请求操作的消息分为了更加精确的，系统消息（指定系统的知识库等等）和用户消息（用户请求）
     * @param systemMessage
     * @param userMessage
     * @param stream
     * @param temperature
     * @return
     */
    public String sendAIRequest(String systemMessage,String userMessage,Boolean stream,Float temperature){
        List<ChatMessage> messages = new ArrayList<>();
        ChatMessage systemChatMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(), systemMessage);
        messages.add(systemChatMessage);
        ChatMessage userChatMessage = new ChatMessage(ChatMessageRole.USER.value(), userMessage);
        messages.add(userChatMessage);
        return sendAIRequest(messages,stream,temperature);
    }

    /**
     * 同步调用AI请求，stream默认为false(同步)，temperature默认为0.95（稳定）
     * @param systemMessage
     * @param userMessage
     * @return
     */
    public String sendSyncAIRequest(String systemMessage, String userMessage,Float temperature) {
        return sendAIRequest(systemMessage,userMessage,Boolean.FALSE,temperature);
    }

    /**
     * 同步调用稳定的AI请求
     * @param systemMessage
     * @param userMessage
     * @return
     */
    public String sendSyncStableAIRequest(String systemMessage, String userMessage) {
        return sendAIRequest(systemMessage,userMessage,Boolean.FALSE,STABLE_TEMPERATURE);
    }

    /**
     * 同步调用不稳定的AI请求
     * @param systemMessage
     * @param userMessage
     * @return
     */
    public String sendSyncUnstableAIRequest(String systemMessage, String userMessage) {
        return sendAIRequest(systemMessage,userMessage,Boolean.FALSE,UNSTABLE_TEMPERATURE);
    }


}
